package com.elinkway.infinitemovies.utils;


import java.io.FileInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Utils {

    private static final char HEX_DIGITS[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            'a', 'b', 'c', 'd', 'e', 'f' };

    public static String md5(String string) {
        byte[] hash;
        try {
            hash = string.getBytes("UTF-8");
            return md5(hash);
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }
        return "unknown";
    }
    public static String md5(byte[] bytes) {
        byte[] hash;
        try {
            hash = MessageDigest.getInstance("MD5").digest(bytes);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("Huh, MD5 should be supported?", e);
        }

        StringBuilder hex = new StringBuilder(hash.length * 2);
        for (byte b : hash) {
            if ((b & 0xFF) < 0x10)
                hex.append("0");
            hex.append(Integer.toHexString(b & 0xFF));
        }
        return hex.toString();
    }

    public static String signByMD5(String unsigned) {
        // 增补上防反编译破解的最后一位
        return signByMD5(unsigned, MoviesConstant.SPREAD_SECRET + "7");
    }

    public static String signByMD5(String unsigned, String secret) {
        String cipher = md5(unsigned + secret);
        return cipher;
    }

    public static String md5File(String filename) {
        InputStream fis;
        byte[] buffer = new byte[1024];
        int numRead = 0;
        MessageDigest md5;
        try{
            fis = new FileInputStream(filename);
            md5 = MessageDigest.getInstance("MD5");
            while((numRead = fis.read(buffer)) > 0) {
                md5.update(buffer,0,numRead);
            }
            fis.close();
            byte[] hash = md5.digest();
            StringBuilder sb = new StringBuilder(hash.length * 2);
            for (int i = 0; i < hash.length; i++) {
                sb.append(HEX_DIGITS[(hash[i] & 0xf0) >>> 4]);
                sb.append(HEX_DIGITS[hash[i] & 0x0f]);
            }
//            StringBuilder hex = new StringBuilder(hash.length * 2);
//            for (byte b : hash) {
//                if ((b & 0xFF) < 0x10)
//                    hex.append("0");
//                hex.append(Integer.toHexString(b & 0xFF));
//            }
            return sb.toString();
        } catch (Exception e) {
            System.out.println("error");
            return null;
        }
    }
}
